#include<stdio.h>     
#include<stdlib.h>
#include<string.h>    

//atof  atoi
double my_atof(const char *str)
{
	//"               +34555.444e+4"
	//"无意义的空格  +/ /- 正文 . 正文 e +/ /- 正文"
	double s = 0.0, d = 10.0, flag = 1.0;
	int count = 0;
	while (*str == ' ')str++;//① 跳过无效空格
	//flag = *str == '+' || *str = '-' ? *str++ : '+';
	if (*str == '-'){ flag = -1.0; str++; }//② 判断符号
	else if (*str == '+'){ str++;}
	
	
	while (*str >= '0' && *str <= '9')//③ 判断第一段正文
	{
		s = s * 10 + *str - '0';
		str++;
	}
	if (*str == '.')//④ 判断是否存在点
		str++;
	while (*str >= '0' && *str <= '9')//⑤ 判断第二段正文
	{
		s += (*str - '0') / d;
		d *= 10.0;
		str++;
	}
	if (*str == 'e' || *str == 'E')//⑥ 判断是否存在e/E
	{
		str++;
		if (*str == '+')//⑦ 在⑥成立的情况下判断指数的符号以及大小
		{
			str++;
			while (*str >= '0' && *str <= '9')
			{
				count = count * 10 + *str - '0';
				str++;
			}
			while (count--)
			s *= 10.0;
		}
		if (*str++ == '-')//⑦ 在⑥成立的情况下判断指数的符号以及大小
		{
			while (*str >= '0' && *str <= '9')
			{
				count = count * 10 + *str - '0';
				str++;
			}
			while (count--)
			s /= 10.0;
		}
	}
	return s*flag;
}

int my_atoi(const char*str)
{
	int s = 0, flag = 1;
	while (*str == ' ')
		str++;
	if (*str++ == '-')
		flag = -1;
	while (*str >= '0' && *str <= '9')
	{
		s = s * 10 + *str - '0';
		str++;
	}
	return s*flag;
}

int main()
{
	char *p = ".3e+4";
	printf("%f\n",atof(p));
	printf("%f\n", my_atof(p));
	return 0;
}
